package SPPBluetooth;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.bluetooth.*;
import java.io.*;
import java.util.*;

public class SPPClienteMIDlet extends MIDlet implements CommandListener, Runnable {
    // Creamos las variables necesarias

    public static SPPClienteMIDlet SPPc = null;
    public static Display display;
    public static SPPCliente c = null;
    public static Mensaje msg = null;
    // Objetos Bluetooth necesarios
    public LocalDevice dispositivoLocal;
    public DiscoveryAgent da;
    //objetos necesarios para establecer la conexion
    static StreamConnection con;
    static DataOutputStream out;
    static DataInputStream in;
    // Lista de dispositivos y servicios encontrados
    public static Vector dispositivos_encontrados = new Vector();
    public static Vector servicios_encontrados = new Vector();
    public static int dispositivo_seleccionado = -1;
    static boolean fin = false;
    static Thread hilo;

    // Constructor
    public SPPClienteMIDlet() {
        SPPc = this;
        hilo = new Thread(this);
    }

    // Implementamos el ciclo de vida del MIDlet
    public void startApp() {
        display = Display.getDisplay(this);

        c = new SPPCliente();
        msg = new Mensaje();

        // Mostramos la lista de dispositivos(vacia al principio)
        c.mostrarDispositivos();

        display.setCurrent(c);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    // Este metodo se encarga de las tareas necesarias para salir del MIDlet
    public static void salir() {
        fin = true;
        // Cerramos la conexion
        try {
            out.close();
            in.close();
            con.close();


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //mostrarAlarma(null, c, 2);

        SPPc.destroyApp(true);
        SPPc.notifyDestroyed();
        SPPc = null;
    }

    // Este metodo se encarga de dar un aviso de alarma cuando se produce una
    // excepcion
    public void mostrarAlarma(Exception e, Screen s, int tipo) {
        Alert alerta = null;
        if (tipo == 0) {
            alerta = new Alert("Excepcion", "Se ha producido la excepcion " + e.getClass().getName(), null, AlertType.ERROR);
        } else if (tipo == 1) {
            alerta = new Alert("Error", "No ha seleccionado un dispositivo ",
                    null, AlertType.ERROR);
        } else if (tipo == 2) {
            alerta = new Alert("Informacion", "El mensaje ha sido enviado ",
                    null, AlertType.INFO);
        }
        alerta.setTimeout(Alert.FOREVER);
        display.setCurrent(alerta, s);
    }

    public void conectar() {

        servicios_encontrados.removeAllElements();
        // Buscamos el servicio de puerto serie en el dispositivo
        // seleccionado
        RemoteDevice dispositivo_remoto = (RemoteDevice) dispositivos_encontrados.elementAt(dispositivo_seleccionado);
        try {
            // Buscamos en el puerto serie 0x1101
            da.searchServices(null, new UUID[]{new UUID(0x1101)},
                    dispositivo_remoto, new ListenerCliente());
        } catch (BluetoothStateException be) {
            mostrarAlarma(be, c, 0);
        }

    }

    // Manejamos la accion del usuario
    public void commandAction(Command co, Displayable d) {
        if (d == c && co.getLabel().equals("Busqueda")) {
            // Limpiamos la lista
            dispositivos_encontrados.removeAllElements();
            servicios_encontrados.removeAllElements();
            try {
                dispositivoLocal = LocalDevice.getLocalDevice();
                dispositivoLocal.setDiscoverable(DiscoveryAgent.GIAC);
                da = dispositivoLocal.getDiscoveryAgent();
                da.startInquiry(DiscoveryAgent.GIAC, new ListenerCliente());

                c.escribirMensaje("Por favor espere...");
            } catch (BluetoothStateException be) {
                mostrarAlarma(be, c, 0);
            }
        } else if (d == c && co.getLabel().equals("Enviar")) {
            dispositivo_seleccionado = c.getSelectedIndex();
            // Nos aseguramos de que el usuario selecciono un dispositivo
            if (dispositivo_seleccionado == -1 || dispositivo_seleccionado >= dispositivos_encontrados.size()) {
                mostrarAlarma(null, c, 1);
                return;
            }

            display.setCurrent(msg);
            conectar();
        } else if (d == c && co.getLabel().equals("Salir")) {
            salir();
        } else if (d == msg && co.getLabel().equals("OK")) {
            enviarMensaje(msg.getString());
        }
    }

    public void abrirCanal() {
        System.out.println("linea 0");
        ServiceRecord sr = (ServiceRecord) servicios_encontrados.elementAt(0);
        System.out.println("linea 1");
        // Obtenemos la URL asociada a este servicio en el dispositivo remoto
        String URL = sr.getConnectionURL(
                ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
        System.out.println("linea 2");
        try {
            con = (StreamConnection) Connector.open(URL);
            out = con.openDataOutputStream();
            in = con.openDataInputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        hilo.start();


    }

    public void enviarMensaje(String msg) {

        try {

            out.writeUTF(msg);
            out.flush();

        } catch (Exception e) {
            mostrarAlarma(e, c, 0);
        }
    }

    public void run() {
		while (!fin) {
			try {
				//System.out.println("��??");
				//in = sc.openDataInputStream();
				// Leemos el mensaje y lo mostramos por pantalla
				String msj=in.readUTF();
				// Cerramos la conexion
				System.out.println(msj);

			} catch (Exception e) {
				System.out.println("h��??");
			//	mostrarAlarma(e, this, 0);
			//	return;
			}
		}

	}
}
